/// <summary> /// Create a new text zone. Its a comment zone shown in both views. /// </summary> private void CreateTextZone() { if (m_isCreating) { if (!m_isDragging) { if (InputFunctions.IsClickingOutsideUI()) { m_startPoint = InputFunctions.GetWorldPoint2D(GlobalManager.Instance.GetActiveCamera()); m_endPoint = InputFunctions.GetWorldPoint2D(GlobalManager.Instance.GetActiveCamera()); m_isDragging = true; currentElement = new TextZoneElement { Text = "Commentaire", BackgroundColor = Color.gray, TextColor = Color.black, TextSize = 1 }; currentElement.associated2DObject = Instantiate(textZonePrefab); currentElement.associated3DObject = Instantiate(textZonePrefab); currentElement.associated2DObject.GetComponentInChildren <TextMesh>().fontStyle = FontStyle.Bold; currentElement.associated3DObject.GetComponentInChildren <TextMesh>().fontStyle = FontStyle.Bold; currentElement.associated2DObject.SetLayerRecursively((int)ErgoLayers.Top); currentElement.associated3DObject.SetLayerRecursively((int)ErgoLayers.ThreeD); } } else { m_endPoint = InputFunctions.GetWorldPoint2D(GlobalManager.Instance.GetActiveCamera()); if (InputFunctions.IsClickingOutsideUI()) { m_isCreating = false; m_isDragging = false; m_helpers.Add(currentElement); OperationsBufferScript.Instance.AddAutoSave("Creation zone de texte"); } currentElement.associated2DObject.transform.position = (m_startPoint + m_endPoint) / 2f; currentElement.Position = VectorFunctions.Switch2D3D((m_startPoint + m_endPoint) / 2f); currentElement.associated3DObject.transform.position = currentElement.Position; (currentElement as TextZoneElement).Size = VectorFunctions.Switch2D3D(currentElement .associated2DObject.GetComponent <TextZoneScript>().SetSize(m_startPoint, m_endPoint)); currentElement.associated3DObject.GetComponent <TextZoneScript>().SetSize(m_startPoint, m_endPoint); // CANCEL if (Input.GetMouseButtonDown(1)) { m_isCreating = false; m_isDragging = false; Destroy(currentElement.associated2DObject); currentElement = null; } } } }
/// <summary> /// Get perpendicular to adjust furniture on the wall /// </summary> public Vector3 GetPerpendicularFromPos(Vector3 pos) { var pos2D = VectorFunctions.Switch3D2D(pos); if (Vector3.Dot(Center - pos2D, Perpendicular) < 0) { //Debug.Log("Perpendicular"); return(VectorFunctions.Switch2D3D(Perpendicular)); } //Debug.Log("Pas Perpendicular"); return(VectorFunctions.Switch2D3D(-Perpendicular)); }
/// <summary> /// adjust 2d and 3d objects transform according to data /// </summary> /// <param name="pos3D"></param> /// <param name="go"></param> /// <param name="startingPos"></param> private void AdjustCurrentFurnitureWallPos3D(Vector3 pos3D, GameObject go, Vector3 startingPos) { if (IsOnWall) { //GetComponent<Rigidbody>().MovePosition associated3DObject.transform.position = new Vector3( pos3D.x, Mathf.Clamp(pos3D.y, 0.1f, 3), pos3D.z ); associated2DObject.transform.position = VectorFunctions.GetExactPositionFrom3DObject(associated2DObject, associated3DObject, associated3DObject.transform.position); //VectorFunctions.Switch3D2D(associated3DObject.transform.position); var w = WallsCreator.Instance.GetWallFromGameObject(go); var perp = w.GetPerpendicularFromPos(pos3D); associated3DObject.transform.rotation = Quaternion.FromToRotation(Vector3.forward, perp); associated3DObject.transform.localEulerAngles = new Vector3( 0, associated3DObject.transform.localEulerAngles.y, EulerAngles.z ); associated2DObject.transform.localEulerAngles = VectorFunctions.Switch2D3D(new Vector3( 0, -associated3DObject.transform.localEulerAngles.y, associated3DObject.transform.localEulerAngles.z )); EulerAngles = associated3DObject.transform.localEulerAngles; AssociatedElement = w; } else { if (pos3D.magnitude != float.PositiveInfinity) { associated3DObject.transform.position = pos3D; //.GetComponent<Rigidbody>().MovePosition(associated3DObject.transform.position + (pos3D - startingPos)); } associated2DObject.transform.position = this is HelperElement ? VectorFunctions.Switch3D2D(associated3DObject.transform.position) : VectorFunctions.GetExactPositionFrom3DObject(associated2DObject, associated3DObject, associated3DObject.transform.position); } }
/// <summary> /// Move function. The starting pos is where the users starts clicking, /// so its a kind of offset so the element does not "teleport" its position into mouse but moves smoothly /// </summary> /// <param name="startingPos">where the users starts clicking</param> public virtual void Move(Vector3 startingPos) { InitVar(); List <string> tags = new List <string> { "" }; if (IsOnWall) { tags.Add("Wall"); } else { tags.Add("Ground"); } if (CanBePutOnFurniture) { tags.Add("Furniture"); } tags.Add("WorkPlane"); switch (cam.gameObject.layer) { case (int)ErgoLayers.Top: Vector3 pos2D = InputFunctions.GetWorldPoint(cam); Vector3 closestProj = pos2D; // If on wall then stick to wall if (IsOnWall) { //Debug.Log("Sticking..."); Wall closestWall = null; // Seek closest projection for a wall foreach (Wall wd in WallsCreator.Instance.GetWalls()) { if (closestWall == null) { closestWall = wd; closestProj = Math3d.ProjectPointOnLineSegment(wd.P1, wd.P2, pos2D); } else { Vector3 proj = Math3d.ProjectPointOnLineSegment(wd.P1, wd.P2, pos2D); if (Vector2.Distance(pos2D, proj) < Vector2.Distance(pos2D, closestProj)) { closestWall = wd; closestProj = proj; } } } AssociatedElement = closestWall; Vector3 pos33D = VectorFunctions.Switch2D3D(closestProj - closestWall.Thickness * (closestProj - pos2D).normalized) + Position.y * Vector3.up; // Repeat the 3D algo and readapt 2D AdjustCurrentFurnitureWallPos3D(pos33D, closestWall.associated3DObject, startingPos); } else { associated2DObject.transform.position += pos2D - startingPos; if (associated3DObject) { float y = 0; if (CanBePutOnFurniture) { GameObject potentialFurniture = InputFunctions.GetHoveredObject2D ( cam2d, associated2DObject.name, true ); if (potentialFurniture) { Furniture f = FurnitureCreator.Instance.GetFurnitureFromGameObject(potentialFurniture); if (f != null) { y = f.Position.y + f.Size.y; } } } associated2DObject.transform.position = new Vector3 ( associated2DObject.transform.position.x, associated2DObject.transform.position.y, -y / 5f ); associated3DObject.transform.position = VectorFunctions.Switch2D3D(associated2DObject.transform.position, y); } } if (text2D) { text2D.transform.position = associated2DObject.transform.position; } break; case (int)ErgoLayers.ThreeD: Vector3 pos3D = InputFunctions.GetWorldPoint(cam); Vector3 closestProj3D = pos3D; GameObject go; if (IsOnWall) { Vector3 pos33D = InputFunctions.GetWorldPoint(out go, cam, associated3DObject, tags.ToArray()); AdjustCurrentFurnitureWallPos3D(pos33D, go, startingPos); } else { if (associated3DObject == null) { return; } //Fix a l'etage l'objet float tmpY = associated3DObject.transform.position.y; associated3DObject.transform.position += pos3D - startingPos; if (associated3DObject) { float y = 0; if (CanBePutOnFurniture) { var potentialFurniture = InputFunctions.GetHoveredObject2D( GlobalManager.Instance.cam2DTop.GetComponent <Camera>(), associated2DObject.name, true); if (potentialFurniture) { var f = FurnitureCreator.Instance.GetFurnitureFromGameObject(potentialFurniture); y = f.Position.y + f.Size.y; } } associated3DObject.transform.position = associated3DObject.transform.position; associated3DObject.transform.position = new Vector3(associated3DObject.transform.position.x, tmpY, associated3DObject.transform.position.z); associated2DObject.transform.position = new Vector3(associated3DObject.transform.position.x, associated3DObject.transform.position.z, associated2DObject.transform.position.z); } } break; } if (associated3DObject) { Position = associated3DObject.transform.position; } else { Position = VectorFunctions.Switch2D3D(associated2DObject.transform.position); } }
/// <summary> /// Build the odt file /// </summary> /// <param name="filePath"></param> public IEnumerator ExportToOdt(string filePath) { m_isExporting = true; // FIRST, GENERATE SCREENSHOTS var folder = Path.GetDirectoryName(filePath); var name = Path.GetFileNameWithoutExtension(filePath); var imagesFolder = Path.Combine(folder, name + "_images"); Directory.CreateDirectory(imagesFolder); var di = new DirectoryInfo(imagesFolder); foreach (var file in di.GetFiles()) { file.Delete(); } var x = Project.GetCurrentFloor().Rooms.Average(r => r.GetCenter().x); var y = Project.GetCurrentFloor().Rooms.Average(r => r.GetCenter().y); var z = Project.GetCurrentFloor().Rooms.Average(r => r.GetCenter().z); yield return(new WaitForSeconds(0.3f)); var whole2D = Path.Combine(imagesFolder, "whole2D.png"); yield return(Screenshot.Instance.TakeBig2DScreenshot(imagesFolder, new Vector3(x, y + 50, z), "whole2D")); yield return(new WaitForSeconds(0.3f)); var whole3D = Screenshot.Instance.TakeBig3DScreenshot(imagesFolder, new Vector3(x, y + 50, z), "whole3D"); yield return(new WaitForSeconds(0.3f)); var whole2DImage = new Image(whole2D); var whole2DFrame = new Frame(); whole2DFrame.Width = new odf.Size(1920 / 4f, odf.Unit.Pixel); whole2DFrame.Height = new odf.Size(1080 / 4f, odf.Unit.Pixel); whole2DFrame.Add(whole2DImage); var whole3DImage = new Image(whole3D); var whole3DFrame = new Frame(); whole3DFrame.Width = new odf.Size(1920 / 4f, odf.Unit.Pixel); whole3DFrame.Height = new odf.Size(1080 / 4f, odf.Unit.Pixel); whole3DFrame.Add(whole3DImage); // ROOM SCREENSHOTS var roomImages = new List <Image>(); var room2DFrames = new List <Frame>(); var room3DFrames = new List <Frame>(); var cpt = 0; foreach (var f in Project.Floors) { yield return(new WaitForSeconds(0.3f)); SetCurrentFloor(Project.Floors.IndexOf(f)); yield return(new WaitForSeconds(0.3f)); var cpt2 = 0; foreach (var ro in f.Rooms) { var room2D = Path.Combine(imagesFolder, ro.Name + "_" + cpt + "_" + cpt2 + "2D.png"); var roomCenter = VectorFunctions.Switch2D3D(ro.GetCenter()); yield return(Screenshot.Instance.TakeBig2DScreenshot(imagesFolder, roomCenter, ro.Name + "_" + cpt + "_" + cpt2 + "2D")); yield return(new WaitForSeconds(0.3f)); var room3D = Screenshot.Instance.TakeBig3DScreenshot(imagesFolder, roomCenter, ro.Name + "_" + cpt + "_" + cpt2 + "3D"); yield return(new WaitForSeconds(0.3f)); var room2DImage = new Image(room2D); var room2DFrame = new Frame(); room2DFrame.Width = new odf.Size(1920 / 4f, odf.Unit.Pixel); room2DFrame.Height = new odf.Size(1080 / 4f, odf.Unit.Pixel); room2DFrame.Add(room2DImage); room2DFrames.Add(room2DFrame); var room3DImage = new Image(room3D); var room3DFrame = new Frame(); room3DFrame.Width = new odf.Size(1920 / 4f, odf.Unit.Pixel); room3DFrame.Height = new odf.Size(1080 / 4f, odf.Unit.Pixel); room3DFrame.Add(room3DImage); room3DFrames.Add(room3DFrame); roomImages.Add(room2DImage); roomImages.Add(room3DImage); cpt2++; yield return(new WaitForSeconds(0.5f)); } cpt++; } // THEN, GENERATE DOC var doc = new odf.TextDocument(); // FONTS var arial = new Font { Name = "Arial", Family = "Arial", GenericFontFamily = GenericFontFamily.Swiss, Pitch = FontPitch.Variable }; doc.Fonts.Add(arial); // STYLES var arial12Style = new ParagraphStyle("Arial12Style"); arial12Style.TextProperties.Font = "Arial"; arial12Style.TextProperties.FontSize = new odf.Size(12, odf.Unit.Point); var titleStyle = new ParagraphStyle("TitleStyle"); titleStyle.ParagraphProperties.TextAlignment = TextAlignment.Center; titleStyle.TextProperties.Font = "Arial"; titleStyle.TextProperties.FontSize = new odf.Size(16, odf.Unit.Point); titleStyle.TextProperties.FontWeight = FontWeight.Bold; titleStyle.ParagraphProperties.BreakBefore = Break.Page; var subtitleStyle = new ParagraphStyle("SubTitleStyle"); subtitleStyle.ParagraphProperties.TextAlignment = TextAlignment.Left; subtitleStyle.TextProperties.Font = "Arial"; subtitleStyle.TextProperties.FontSize = new odf.Size(12, odf.Unit.Point); subtitleStyle.TextProperties.FontWeight = FontWeight.Bold; subtitleStyle.TextProperties.UnderlineType = UnderlineType.Single; var breakPage = new ParagraphStyle("BreakPage"); breakPage.ParagraphProperties.BreakBefore = Break.Page; var cs1 = new CellStyle("CS1"); cs1.TextProperties.Color = "#555555"; doc.AutomaticStyles.Styles.Add(titleStyle); doc.AutomaticStyles.Styles.Add(arial12Style); doc.AutomaticStyles.Styles.Add(subtitleStyle); doc.AutomaticStyles.Styles.Add(breakPage); doc.AutomaticStyles.Styles.Add(cs1); // CONTENT // FIRST PAGE var p1 = new odf.Paragraph { Style = "Arial12Style" }; p1.Add(Project.ProjectName); p1.AddLineBreak(); p1.Add(Project.Person.FirstName + " " + Project.Person.LastName); // SECOND PAGE var p2 = new odf.Paragraph { Style = "TitleStyle" }; p2.Add("PRECONISATIONS D'AMENAGEMENT DU LOGEMENT"); p2.AddLineBreak(); p2.AddLineBreak(); var p3 = new odf.Paragraph { Style = "SubTitleStyle" }; p3.Add("Le bénéficiaire"); var p4 = new odf.Paragraph { Style = "Arial12Style" }; p4.Add("Projet : " + Project.ProjectName); p4.AddLineBreak(); p4.Add("Date : " + Project.Date.ToShortDateString()); p4.AddLineBreak(); p4.Add("Bénéficiaire : " + Project.Person.FirstName + " " + Project.Person.LastName); p4.AddLineBreak(); p4.Add("Version : v." + Project.Version); p4.AddLineBreak(); p4.Add("Commentaire : " + Project.Comment); p4.AddLineBreak(); p4.AddLineBreak(); p4.AddLineBreak(); var p5 = new odf.Paragraph { Style = "SubTitleStyle" }; p5.Add("La modélisation"); var p6 = new odf.Paragraph { Style = "Arial12Style" }; p6.Add("Type de logement : " + Project.HomeType); p6.AddLineBreak(); p6.Add("Nombre d'étages : " + Project.Floors.Count); p6.AddLineBreak(); p6.Add("Nombre de pièces total : " + Project.Floors.Sum(f => f.Rooms.Count())); p6.AddLineBreak(); p6.Add("Superficie totale : "); p6.AddLineBreak(); // ss p6.Add(whole2DFrame); p6.AddLineBreak(); p6.AddLineBreak(); p6.AddLineBreak(); // ss p6.Add(whole3DFrame); p6.AddLineBreak(); // ROOMS var pBreakPage = new odf.Paragraph(); pBreakPage.Style = "BreakPage"; pBreakPage.Add(""); var p7 = new odf.Paragraph(); p7.Style = "SubTitleStyle"; p7.Add("Les pièces"); var roomsParagraphs = new List <odf.Paragraph>(); cpt = 1; foreach (var f in Project.Floors) { foreach (var r in f.Rooms) { var curParaTitle = new odf.Paragraph(); curParaTitle.Style = "SubTitleStyle"; curParaTitle.AddTab(); curParaTitle.Add("Pièce n°" + cpt + " : " + r.Name); curParaTitle.AddLineBreak(); curParaTitle.AddTab(); curParaTitle.AddTab(); curParaTitle.Add("Présentation"); var curPara = new odf.Paragraph(); curPara.Add("Etage : " + f.FloorName); curPara.AddLineBreak(); curPara.Add("Nombre de murs : " + r.Walls.Count); curPara.AddLineBreak(); curPara.Add("Epaisseur des murs : "); var ths = ""; foreach (var w in r.Walls) { ths += w.Thickness + "m, "; } curPara.Add(ths); curPara.AddLineBreak(); curPara.Add(room2DFrames[cpt - 1]); curPara.Add(room3DFrames[cpt - 1]); curPara.AddLineBreak(); roomsParagraphs.Add(curParaTitle); roomsParagraphs.Add(curPara); cpt++; } // MEUBLES var furniTitle = new odf.Paragraph(); furniTitle.Style = "SubTitleStyle"; furniTitle.AddTab(); furniTitle.AddTab(); furniTitle.Add("Meubles"); roomsParagraphs.Add(furniTitle); foreach (var fu in f.Furnitures) { if (fu.Type != "AideTechnique") { var p = new odf.Paragraph(); p.Style = "Arial12Style"; p.Add(fu.GetDescription()); roomsParagraphs.Add(p); } } // AIDES TECHNIQUES var furni2Title = new odf.Paragraph(); furni2Title.Style = "SubTitleStyle"; furni2Title.AddTab(); furni2Title.AddTab(); furni2Title.Add("Aides techniques"); roomsParagraphs.Add(furni2Title); foreach (var fu in f.Furnitures) { if (fu.Type == "AideTechnique") { var p = new odf.Paragraph(); p.Style = "Arial12Style"; p.Add(fu.GetDescription()); roomsParagraphs.Add(p); } } // COMMENTS var comTitle = new odf.Paragraph(); comTitle.Style = "SubTitleStyle"; comTitle.AddTab(); comTitle.AddTab(); comTitle.Add("Commentaires"); roomsParagraphs.Add(comTitle); foreach (var tz in f.TextZoneElements) { var p = new odf.Paragraph(); p.Style = "Arial12Style"; p.Add(tz.GetDescription()); roomsParagraphs.Add(p); } // MOBILITE var chTitle = new odf.Paragraph(); chTitle.Style = "SubTitleStyle"; chTitle.AddTab(); chTitle.AddTab(); chTitle.Add("Mobilité"); roomsParagraphs.Add(chTitle); foreach (var ch in f.Characters) { var p = new odf.Paragraph(); p.Style = "Arial12Style"; p.Add(ch.GetDescription()); roomsParagraphs.Add(p); } } //==================================== // POUR RESUMER var ps1 = new odf.Paragraph(); ps1.Style = "SubTitleStyle"; ps1.Add("Pour résumer"); var ps2 = new odf.Paragraph(); ps2.Style = "Arial12Style"; ps2.Add("Nombre de pièces : " + Project.Floors.Sum(f => f.Rooms.Count())); ps2.AddLineBreak(); var pieces = ""; foreach (var f in Project.Floors) { foreach (var r in f.Rooms) { pieces += r.Name + ", "; } } ps2.Add("Pièces : " + pieces); ps2.AddLineBreak(); var cell1 = new odf.Cell("Aide technique"); var cell2 = new odf.Cell("Pièce associée"); var cell3 = new odf.Cell("Commentaire"); cell1.Style = "CS1"; cell2.Style = "CS1"; cell3.Style = "CS1"; var row1 = new odf.Row(); row1.Cells.Add(cell1); row1.Cells.Add(cell2); row1.Cells.Add(cell3); var table1 = new odf.Table(); table1.Rows.Add(row1); foreach (var f in Project.Floors) { foreach (var fu in f.Furnitures) { if (fu.Type == "AideTechnique") { var ro = new odf.Row(); ro.Cells.Add(new odf.Cell(fu.Name)); ro.Cells.Add(new odf.Cell("")); ro.Cells.Add(new odf.Cell("")); table1.Rows.Add(ro); } } } // If table is empty, add an empty line if (table1.Rows.Count == 1) { var ro = new odf.Row(); ro.Cells.Add(new odf.Cell("")); ro.Cells.Add(new odf.Cell("")); ro.Cells.Add(new odf.Cell("")); table1.Rows.Add(ro); } var ps3 = new odf.Paragraph(); ps3.Style = "Arial12Style"; ps3.Add("[nom_preconisateur] "); ps3.AddTab(); ps3.Add(DateTime.Now.ToShortDateString()); ps3.AddTab(); ps3.Add("Version ErgoShop " + GlobalManager.VERSION); ps3.AddLineBreak(); // DOC CONSTRUCTION doc.Body.Add(p1); doc.Body.Add(p2); doc.Body.Add(p3); doc.Body.Add(p4); doc.Body.Add(p5); doc.Body.Add(p6); doc.Body.Add(pBreakPage); doc.Body.Add(p7); foreach (var p in roomsParagraphs) { doc.Body.Add(p); } doc.Body.Add(pBreakPage); doc.Body.Add(ps1); doc.Body.Add(ps2); doc.Body.Add(table1); doc.Body.Add(ps3); doc.Save(filePath, true); UIManager.Instance.ShowCustomMessage("FICHIER ODT EXPORTE"); yield return(new WaitForSeconds(0.2f)); GlobalManager.Instance.SwitchViewMode(); yield return(new WaitForSeconds(0.2f)); GlobalManager.Instance.Set2DTopMode(); m_isExporting = false; }
// Update is called once per frame private void Update() { m_element = null; if (SelectedObjectManager.Instance.currentFurnitureData.Count == 1) { m_element = SelectedObjectManager.Instance.currentFurnitureData[0].associated3DObject; m_wall = SelectedObjectManager.Instance.currentFurnitureData[0].AssociatedElement as Wall; } up.gameObject.SetActive(m_element); down.gameObject.SetActive(m_element); left.gameObject.SetActive(m_element); right.gameObject.SetActive(m_element); if (m_element) { var b = m_element.GetMeshBounds(); var upPoint = Vector3.positiveInfinity; var downPoint = Vector3.positiveInfinity; var leftPoint = Vector3.positiveInfinity; var rightPoint = Vector3.positiveInfinity; if (SelectedObjectManager.Instance.currentFurnitureData[0].IsOnWall) { upPoint = new Vector3(b.center.x, b.max.y, b.center.z); downPoint = new Vector3(b.center.x, b.min.y, b.center.z); } else { upPoint = new Vector3(b.center.x, b.center.y, b.min.z); downPoint = new Vector3(b.center.x, b.center.y, b.max.z); } leftPoint = b.center + m_element.transform.right * b.size.x / 2f * -1f; rightPoint = b.center + m_element.transform.right * b.size.x / 2f; up.start = upPoint; //GetPointFromRay(upPoint, Vector3.down, null); down.start = downPoint; //GetPointFromRay(downPoint, Vector3.up, null); left.start = leftPoint; //GetPointFromRay(leftPoint, Vector3.right, null); right.start = rightPoint; //GetPointFromRay(rightPoint, Vector3.left, null); if (SelectedObjectManager.Instance.currentFurnitureData[0].IsOnWall) { up.end = GetPointFromRayFromCot3D(up, Vector3.up, m_element); down.end = GetPointFromRayFromCot3D(down, Vector3.down, m_element); left.end = GetPointFromRayFromCot3D(left, VectorFunctions.Switch2D3D(m_wall.Direction), m_element); right.end = GetPointFromRayFromCot3D(right, VectorFunctions.Switch2D3D(-m_wall.Direction), m_element); } else { up.end = GetPointFromRayFromCot3D(up, Vector3.back, m_element); down.end = GetPointFromRayFromCot3D(down, Vector3.forward, m_element); left.end = GetPointFromRayFromCot3D(left, Vector3.left, m_element); //m_element.transform.right*-1f right.end = GetPointFromRayFromCot3D(right, Vector3.right, m_element); //m_element.transform.right } up.gameObject.SetActive(up.end != Vector3.positiveInfinity && up.Length > 0 && up.Length != float.PositiveInfinity); down.gameObject.SetActive(down.end != Vector3.positiveInfinity && down.Length > 0 && down.Length != float.PositiveInfinity); left.gameObject.SetActive(left.end != Vector3.positiveInfinity && left.Length > 0 && left.Length != float.PositiveInfinity); right.gameObject.SetActive(right.end != Vector3.positiveInfinity && right.Length > 0 && right.Length != float.PositiveInfinity); // ROTATION FACE TO CAM IN 3D var cs = new List <CotationsScript> { up, down, left, right }; var camTrans = GlobalManager.Instance.GetActiveCamera().transform; foreach (var c in cs) { var tr = new List <Transform> { c.middle1.transform, c.middle2.transform }; foreach (var t in tr) { t.LookAt(camTrans); t.localEulerAngles = new Vector3(0, t.localEulerAngles.y, 180); } c.arrow1.localEulerAngles = new Vector3(c.arrow1.localEulerAngles.x, c.middle1.transform.localEulerAngles.y, c.arrow1.localEulerAngles.z); c.arrow2.localEulerAngles = new Vector3(c.arrow2.localEulerAngles.x, c.middle1.transform.localEulerAngles.y, c.arrow2.localEulerAngles.z); //c.cotationTM.transform.LookAt(camTrans); //c.cotationTM.transform.rotation *= Quaternion.Euler(Vector3.up * 180f); //c.arrow2.localEulerAngles = new Vector3(0,c.arrow2.localEulerAngles.y, c.arrow2.localEulerAngles.z+180); c.cotationTM.transform.rotation = camTrans.rotation; } } else { up.gameObject.SetActive(false); down.gameObject.SetActive(false); left.gameObject.SetActive(false); right.gameObject.SetActive(false); } }
/// <summary> /// Draw the Arc /// </summary> public void DrawAngle() { var arcPoints = new List <Vector3>(); m_radius = wallOpening.Size.x; m_startAngle = -wallOpening.associated3DObject.transform.eulerAngles.y; if (wallOpening.IsDouble) { m_radius = m_radius / 2f; if (wallOpening.IsPull) { m_startAngle -= 90f; } else { m_startAngle -= 180f; } } else { if (wallOpening.IsLeft) { m_startAngle -= 90f; } if (wallOpening.IsPull) { if (wallOpening.IsLeft) { m_startAngle -= 90f; } else { m_startAngle += 90f; } } } var centers = wallOpening.GetCorners(); m_angle = 90f; m_segments = Mathf.RoundToInt(m_angle); var curAngle = m_startAngle; float buff = 0; foreach (var c in centers) { var center = c; //if (is3D) center = VectorFunctions.Switch2D3D(center, 0.05f); curAngle = m_startAngle + buff; for (var i = 0; i <= m_segments; i++) { var x = Mathf.Cos(Mathf.Deg2Rad * curAngle) * m_radius; var y = Mathf.Sin(Mathf.Deg2Rad * curAngle) * m_radius; var pos = new Vector3(x, y, -0.00001f) + center; if (is3D) { pos = VectorFunctions.Switch2D3D(pos, 0.05f); } arcPoints.Add(pos); curAngle += m_angle / m_segments; } buff = wallOpening.IsPull ? 90f : -90f; } var col = Color.white * 0.6f * (wallOpening.IsWindow ? 1f : 0.6f); LineRend.positionCount = arcPoints.Count; LineRend.SetPositions(arcPoints.ToArray()); LineRend.startColor = col; LineRend.endColor = col; LineRend.startWidth = 0.1f; LineRend.endWidth = 0.1f; LineRend.gameObject.SetActive(m_angle != -999); }
/// <summary> /// Main method, called when the users stars dragging one of the buttons /// </summary> private void ClickArrow() { var me = SelectedObjectManager.Instance.currentSelectedElements.First() as MovableElement; // Press on arrow = select arrow if (InputFunctions.IsClickingOutsideUI()) { var go = InputFunctions.GetHoveredObject2D(GlobalManager.Instance.GetActiveCamera()); // Debug.Log("CLICK ARROW " + go); if (!go || go.tag != "ElementArrow") { isMoving = false; return; } currentArrow = go; } // Release = no arrow if (Input.GetMouseButtonUp(0) && currentArrow != null) { currentArrow = null; OperationsBufferScript.Instance.AddAutoSave("Etirement"); } // if arrow if (currentArrow) { var proj = Vector3.zero; var dif = Vector3.zero; var sizeCompo = Vector3.zero; float dist = 0; var direction = Vector3.zero; var mousePos = InputFunctions.GetWorldPoint2D(GlobalManager.Instance.GetActiveCamera()); if (m_prevPos == mousePos) { return; } //Debug.Log("FLECHE " + currentArrow.name); switch (currentArrow.name) { case "Up": direction = me.associated2DObject.transform.up; proj = Vector3.Project(mousePos - oUp, direction) + oUp; dif = proj - oUp; dist = Vector3.Distance(proj, oUp); sizeCompo = Vector3.up; break; case "Down": direction = -me.associated2DObject.transform.up; proj = Vector3.Project(mousePos - oDown, direction) + oDown; dif = proj - oDown; dist = Vector3.Distance(proj, oDown); sizeCompo = Vector3.up; break; case "Left": direction = -me.associated2DObject.transform.right; proj = Vector3.Project(mousePos - oLeft, direction) + oLeft; dif = proj - oLeft; dist = Vector3.Distance(proj, oLeft); sizeCompo = Vector3.right; break; case "Right": direction = me.associated2DObject.transform.right; proj = Vector3.Project(mousePos - oRight, direction) + oRight; dif = proj - oRight; dist = Vector3.Distance(proj, oRight); sizeCompo = Vector3.right; break; case "UpLeft": direction = -me.associated2DObject.transform.right + me.associated2DObject.transform.up; proj = Vector3.Project(mousePos - oUpLeft, direction) + oUpLeft; dif = proj - oUpLeft; dist = Vector3.Distance(proj, oUpLeft); sizeCompo = Vector3.up + Vector3.right; break; case "UpRight": direction = me.associated2DObject.transform.right + me.associated2DObject.transform.up; proj = Vector3.Project(mousePos - oUpRight, direction) + oUpRight; dif = proj - oUpRight; dist = Vector3.Distance(proj, oUpRight); sizeCompo = Vector3.up + Vector3.right; break; case "DownLeft": direction = -me.associated2DObject.transform.right - me.associated2DObject.transform.up; proj = Vector3.Project(mousePos - oDownLeft, direction) + oDownLeft; dif = proj - oDownLeft; dist = Vector3.Distance(proj, oDownLeft); sizeCompo = Vector3.up + Vector3.right; break; case "DownRight": direction = me.associated2DObject.transform.right - me.associated2DObject.transform.up; proj = Vector3.Project(mousePos - oDownRight, direction) + oDownRight; dif = proj - oDownRight; dist = Vector3.Distance(proj, oDownRight); sizeCompo = Vector3.up + Vector3.right; break; } SetSizeCompoAndDirection(dif, direction, sizeCompo, out direction, out sizeCompo); me.SetPosition(me.Position + VectorFunctions.Switch2D3D(dist * direction / 4f)); me.SetSize(me.Size + VectorFunctions.Switch2D3D(dist * sizeCompo / 2f)); if (me is Furniture) { (me as Furniture).AdjustSpriteSize(); } currentArrow.transform.position = new Vector3(proj.x, proj.y, me.associated2DObject.transform.position.z); isMoving = true; m_prevPos = proj; FurniturePropScript.Instance.UpdateFurnitureProperties(); } else { isMoving = false; } }