using sam; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Height3DOutline : MonoBehaviour { public HeightVariableVisualizer hvv; public Camera cam; public float lineWidthScalar3d = 1.0f; public float lineWidthScalar2d = 1.0f; public Transform circleQuad; public Transform trackballTarget; public HeightVariableScrollRect scrollRect; ProductDataPoint selectedDataPoint = null; public LineRenderer lr3d; public LineRenderer lr2d; private Vector3[] positions = new Vector3[4]; private Vector3[] positions2 = new Vector3[4]; [HideInInspector] public Vector3 center; public GameObject extrusionParent; public LineRenderer lr3d_extr_cap; public LineRenderer[] lr3d_extr_sides; private Vector3[] capPositions = new Vector3[4]; private List sidePositions = new List { new Vector3[4], new Vector3[4], new Vector3[4], new Vector3[4] }; bool isVisible = false; private void Awake() { //lr3d = GetComponentInChildren(); lr3d.positionCount = 4; lr3d.gameObject.SetActive(false); lr2d.positionCount = 4; lr2d.gameObject.SetActive(false); circleQuad.gameObject.SetActive(false); extrusionParent.SetActive(false); //lr3d_extr_cap.gameObject.SetActive(false); //foreach(var lr in lr3d_extr_sides) // lr.gameObject.SetActive(false); } public void OnDataPointDeselected() { Debug.Log("OnDataPointDeselected called"); selectedDataPoint = null; lr3d.gameObject.SetActive(false); lr2d.gameObject.SetActive(false); isVisible = false; extrusionParent.SetActive(false); circleQuad.gameObject.SetActive(false); } public void OnViewModeChanged(bool newMode) { if (selectedDataPoint != null) OnDataPointSelected(selectedDataPoint); } public void OnDataPointSelected(ProductDataPoint dp) { //Debug.Log("OnDataPointSelected called"); selectedDataPoint = dp; int i = dp.dataPointIndex * 4; positions[0] = hvv.verts[i]; positions[1] = hvv.verts[i + 1]; positions[2] = hvv.verts[i + 3]; positions[3] = hvv.verts[i + 2]; lr3d.SetPositions(positions); lr3d.gameObject.SetActive(true); isVisible = true; extrusionParent.SetActive(hvv.useExtrusion); if (hvv.useExtrusion) { capPositions[0] = hvv.vertsPar[1][i]; capPositions[1] = hvv.vertsPar[1][i + 1]; capPositions[2] = hvv.vertsPar[1][i + 3]; capPositions[3] = hvv.vertsPar[1][i + 2]; lr3d_extr_cap.SetPositions(capPositions); for (int s=0; s<4; s++) { sidePositions[s][0] = positions[s]; sidePositions[s][1] = capPositions[s]; lr3d_extr_sides[s].SetPositions(sidePositions[s]); } center = (positions[0] + positions[1] + positions[2] + positions[3] + capPositions[0] + capPositions[1] + capPositions[2] + capPositions[3]) * 0.125f; } else { center = (positions[0] + positions[1] + positions[2] + positions[3]) * 0.25f; } if (trackballTarget != null) trackballTarget.position = center; positions2[0] = hvv.verts2d[i]; positions2[1] = hvv.verts2d[i + 1]; positions2[2] = hvv.verts2d[i + 3]; positions2[3] = hvv.verts2d[i + 2]; lr2d.SetPositions(positions2); lr2d.gameObject.SetActive(true); circleQuad.gameObject.SetActive(true); } public void Update() { if (isVisible) { float dist = (cam.transform.position - center).magnitude; float s = dist * lineWidthScalar3d / Screen.height; // Todo: how to set LineRenderer line widths? lr3d.startWidth = s; lr3d.endWidth = s; if (hvv.useExtrusion) { lr3d_extr_cap.startWidth = lr3d_extr_cap.endWidth = s; foreach(var lr in lr3d_extr_sides) lr.startWidth = lr.endWidth = s; } float w = Mathf.Max(1.0f, (lineWidthScalar2d / scrollRect.CurrentZoom)); lr2d.startWidth = lr2d.endWidth = w; Vector3 p = cam.transform.InverseTransformPoint(center); p /= ( 10.0f * p.z); circleQuad.localPosition = p; } } }